package com.ruoyi.web.tool;


import cn.hutool.core.util.ObjectUtil;

import java.util.EnumSet;
import java.util.Objects;

/**
 * @ClassName: IBaseEnum
 * @Description:  枚举通用接口
 * @Author: liurb
 * @Date: 2022/8/19 01:36
 * @Version: 1.0
 **/
public interface IBaseEnum<T> {

    T value();

    String description();

    /**
     * 根据值获取枚举
     *
     * @param value
     * @param clazz
     * @param <E>   枚举
     * @return
     */
    static <E extends Enum<E> & IBaseEnum> E getEnumByValue(Object value, Class<E> clazz) {
        Objects.requireNonNull(value);
        EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
        E matchEnum = allEnums.stream()
                .filter(e -> ObjectUtil.equal(e.value(), value))
                .findFirst()
                .orElse(null);
        return matchEnum;
    }

    /**
     * 根据文本标签获取值
     *
     * @param value
     * @param clazz
     * @param <E>
     * @return
     */
    static <E extends Enum<E> & IBaseEnum> String getDescByValue(Object value, Class<E> clazz) {
        Objects.requireNonNull(value);
        EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
        E matchEnum = allEnums.stream()
                .filter(e -> ObjectUtil.equal(e.value(), value))
                .findFirst()
                .orElse(null);

        String desc = null;
        if (matchEnum != null) {
            desc = matchEnum.description();
        }
        return desc;
    }


    /**
     * 根据文本标签获取值
     *
     * @param desc
     * @param clazz
     * @param <E>
     * @return
     */
    static <E extends Enum<E> & IBaseEnum> Object getValueByDesc(String desc, Class<E> clazz) {
        Objects.requireNonNull(desc);
        EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
        String finalLabel = desc;
        E matchEnum = allEnums.stream()
                .filter(e -> ObjectUtil.equal(e.description(), finalLabel))
                .findFirst()
                .orElse(null);

        Object value = null;
        if (matchEnum != null) {
            value = matchEnum.value();
        }
        return value;
    }

}
